home *** CD-ROM | disk | FTP | other *** search
/ Experimental BBS Explossion 3 / Experimental BBS Explossion III.iso / c / pcw.zip / FONTS.C < prev    next >
Text File  |  1990-01-21  |  4KB  |  103 lines

  1. /***************************************************************/
  2. /* File Id.                       Fonts.C                      */
  3. /* Author.                        Stan Milam.                  */
  4. /* Date Written.                  12 Dec 89                    */
  5. /*                                                             */
  6. /*           (c) Copyright 1989, 1990 by Stan Milam            */
  7. /*                                                             */
  8. /* Comments:  Routines to download EGA/VGA ROM fonts and to    */
  9. /* load user fonts into EGA/VGA registers.                     */
  10. /***************************************************************/
  11.  
  12. #include <stdio.h>
  13. #include <dos.h>
  14. #include "pcwproto.h"
  15.  
  16. void far Intr(int intno, struct REGPACK far *regs);
  17.  
  18. /***************************************************************/
  19. /*                      download_rom_font()                    */
  20. /*                                                             */
  21. /* Download an 8x14 or 8x16 font into a buffer provided by the */
  22. /* application programmer.                                     */
  23. /* Buffer should be large enough to hold 256 * 14 or 256 * 16  */
  24. /* Returns number of bytes per character, zero if function fail*/
  25. /***************************************************************/
  26.  
  27. int download_rom_font(int font, char *buffer) {
  28.  
  29.    struct REGPACK regs;
  30.    char far *temp;
  31.    int  mxr, mxc;
  32.  
  33.    if (!chk_video_state(&mxc, &mxr)) return(0);
  34.    if ((_adaptor < EGA) || (_adaptor < VGA && font == 16)) return(0);
  35.    temp = (char far *) buffer;
  36.    switch (font) {
  37.       case 14 : regs.r_bx = 0x0200; break;
  38.       case 16 : regs.r_bx = 0x0600; break;
  39.       default : return(0);
  40.    }
  41.    regs.r_ax = 0x1130;
  42.    Intr(0x10, (struct REGPACK far *) ®s);
  43.    farcopy(temp, MK_FP(regs.r_es,regs.r_bp), font * 256);
  44.    return(font);
  45. }
  46.  
  47. /***************************************************************/
  48. /*                       load_user_font()                      */
  49. /*                                                             */
  50. /* Load a user defined font pointed to by *buffer into EGA/VGA */
  51. /* registers.  A mode reset will reload default font.  Parms   */
  52. /* as follows:                                                 */
  53. /*    bpc: bytes per character (14 or 16)                      */
  54. /*    blk: video block to load font (usually 0)                */
  55. /*  nchrs: number of chars in buffer.                          */
  56. /*  fchar: first character of the font buffer                  */
  57. /* *buffer:the font table, of course.                          */
  58. /*                                                             */
  59. /* Returns non-zero value if successful.                       */
  60. /***************************************************************/
  61.  
  62. int load_user_font(int bpc,int blk,int nchrs,int fchar,char *buffer) {
  63.  
  64.    char far *temp;
  65.    struct REGPACK regs;
  66.    int mxr, mxc;
  67.  
  68.    if (!chk_video_state(&mxr,&mxc)) return(0);
  69.    if (_adaptor < EGA) return(0);
  70.    temp = (char far *) buffer;
  71.    regs.r_ax = 0x1100;
  72.    regs.r_bx = (bpc << 8) | blk;
  73.    regs.r_cx = nchrs;
  74.    regs.r_dx = fchar;
  75.    regs.r_es = FP_SEG(temp);
  76.    regs.r_bp = FP_OFF(temp);
  77.    Intr(0x10, (struct REGPACK far *) ®s);
  78.    return(1);
  79. }
  80.  
  81. /* Some test code:  make 'a' be 'b' and 'b' to 'c' and so on...
  82.  
  83. void main(void) {
  84.  
  85.    int i, j, k, x, y;
  86.    static char ftable[16*256];
  87.  
  88.    chk_video_state(&i,&j);
  89.    if (_adaptor > CGA) {
  90.       k = download_rom_font((_adaptor == EGA) ? 14 : 16, ftable);
  91.       for (i = 'a'; i <= 'z'; i++) {
  92.           j = i * k;
  93.           x = j + k;
  94.           while( j < x) {
  95.               ftable[j] = ftable[j + k];
  96.               j++;
  97.           }
  98.       }
  99.       load_user_font(k,0,256,0,ftable);
  100.    }
  101. }
  102. */
  103.